package com.wtwd.campus.dao;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wtwd.campus.entity.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

@Mapper
public interface AttendanceRuleMapper {
    /**
     * 添加考勤规则信息
     * @param data
     * @return
     */
    int addAttendanceRuleMess(@Param("data") AttendanceRulesVO data);

    /**
     * 添加每日打卡时间信息
     * @param id
     * @return
     */
    int addWeekDayMess(@Param("id") Integer id,@Param("list") List<Map<String,Object>> list);

    /**
     * 根据学校id和名称查询是否重复
     * @return
     */
    Map<String,Object> judgeAttendanceRuleName(@Param("name") String name,@Param("schoolId") Integer schoolId);

    /**
     * 根据学校id查询所有的考勤信息
     * @param schoolId
     * @return
     */
    List<AttendanceRulesVO> getAttendanceRulesBySchoolId(@Param("schoolId") Integer schoolId);

    /**
     * 根据考勤信息id获取每日考勤规则列表
     * @param list
     * @return
     */
    List<WeekDayRule> getWeekDayListByIdList(@Param("list") List<Integer> list);

    /**
     * 根据id查询一笔考勤信息
     * @param id
     * @return
     */
    AttendanceRulesVO getAttendanceRulesById(@Param("id") Integer id);

    /**
     * 修改考勤规则信息
     * @param data
     * @return
     */
    int modifyAttendanceRules(@Param("data") AttendanceRulesVO data);

    /**
     * 根据id删除每日打卡信息
     * @param id
     * @return
     */
    int deleteWeekDayRule(@Param("id") Integer id);

    /**
     * 根据id删除考勤机打卡规则
     * @param id
     * @return
     */
    int deleteAttendanceById(@Param("id") Integer id);

    /**
     * 根据学校id查询考勤设置
     * @param schoolId
     * @return
     */
    IPage<Map<String,Object>> getAttendanceSetBySchoolId(@Param("schoolId") Integer schoolId, @Param("page") Page<Map<String,Object>> page);

    /**
     * 根据年级id查询考勤设置
     * @param gradeId
     * @return
     */
    IPage<Map<String,Object>>  getAttendanceSetByGradeId(@Param("gradeId") Integer gradeId, @Param("page") Page<Map<String,Object>> page);

    /**
     * 根据学校id获取未绑定考勤规则的年级信息
     * @param schoolId
     * @return
     */
    List<Map<String,Object>> getUnBindingGradeBySchoolId(@Param("schoolId") Integer schoolId);

    /**
     * 根据学校id获取未绑定的考勤规则信息
     * @param schoolId
     * @return
     */
    List<Map<String,Object>> getRulesBySchoolId(@Param("schoolId") Integer schoolId);

    /**
     * 添加考勤规则
     * @param data
     * @return
     */
    int addAttendanceSetting(@Param("data") AttendanceSetting data);

    /**
     * 修改考勤规则
     * @param data
     * @return
     */
    int modifyAttendanceSetting(@Param("data") AttendanceSetting data);

    /**
     * 修改考勤开关
     * @param data
     * @return
     */
    int modifyAttendanceSetFlag(@Param("data") AttendanceSetting data);

    /**
     * 删除一笔考勤信息
     * @param id
     * @return
     */
    int deleteAttendanceSetting(@Param("id") Integer id);

    /**
     * 条件查询考勤记录
     */
    IPage<Map<String,Object>> getAttendanceRecordList(@Param("data") AttendanceRecordVO data, @Param("page") Page<Map<String,Object>> page);

    /**
     * 条件查询导出考勤记录
     */
    List<Map<String,Object>> getExportRecordList(@Param("data") AttendanceRecordVO data);

    /**
     * 批量存储考勤元数据
     * @param list
     * @return
     */
    int saveAttendanceMetaRecordList(@Param("list") List<Map<String,Object>>  list);

    /**
     * 查询学生是否有对应的考勤规则
     * @param weekDay
     * @param schoolId
     * @return
     */
    Map<String,Object> getRulesByCondition(@Param("weekDay") Integer weekDay,@Param("schoolId") Integer schoolId,@Param("gradeId") Integer gradeId);

    /**
     * 根据学生id和时间查找一笔打卡记录
     * @param time
     * @param stuId
     * @return
     */
    AttendanceRecordData getAttendanceRecordByCondition(@Param("time") Long time, @Param("stuId") Integer stuId);

    /**
     * 批量新增考勤记录
     * @param list
     * @return
     */
    int addAttendanceRecord(@Param("list") List<AttendanceRecordData> list);

    /**
     * 查询今日无打卡记录的学生id
     * @param week
     * @return
     */
    List<Map<String,Object>> getNoRecordStuIdList(@Param("week") Integer week,@Param("status") Integer status,@Param("time") Long time);

    /**
     * 查询今日有打卡记录且未签到的学生id
     * @param week
     * @return
     */
    List<Integer> getRecordStuIdList(@Param("week") Integer week,@Param("status") Integer status,@Param("time") Long time);

    /**
     * 查看考勤规则是否与年纪绑定了
     * @param ruleId
     * @return
     */
    int getAttendanceSetCountByRuleId(@Param("ruleId") Integer ruleId);

    /**
     * 根据学生id查找推送信息
     * @param list
     * @return
     */
    List<Map<String,Object>> getPushMess(@Param("list") List<Integer> list);

    /**
     * 查找打卡正常的学生信息
     * @param time
     * @param status
     * @return
     */
    List<Map<String,Object>> getNormalRecordPushMess(@Param("time") Long time,@Param("status")  Integer status);

    /**
     * 查找打卡迟到的学生信息
     * @param time
     * @param status
     * @return
     */
    List<Map<String,Object>> getBeLateRecordPushMess(@Param("time") Long time,@Param("status")  Integer status);

    /**
     * 查找早退的学生信息
     * @param time
     * @param status
     * @return
     */
    List<Map<String,Object>> getLeaveEarlyRecordPushMess(@Param("time") Long time,@Param("status")  Integer status);

    /**
     * 根据班级id时间以及类型查询打卡记录
     * @param time
     * @param classId
     * @return
     */
    List<Map<String,Object>> getWxAttendanceRecordList(@Param("classId") Integer classId,@Param("time") Long time,@Param("type") Integer type,@Param("status") Integer status);

    /**
     * 判断查询的日期的打卡类型是否被设置
     * @param week
     * @param classId
     * @param type
     * @return
     */
    int judgeIfSetRule(@Param("week") Integer week,@Param("classId") Integer classId,@Param("type") Integer type);


    /**
     * 微信公众号查看未打卡的学生信息
     * @param time
     * @param classId
     * @return
     */
    List<Map<String,Object>> getWxUnRecordList(@Param("time") Long time,@Param("classId")  Integer classId,@Param("type") Integer type);

    /**
     * 批量修改考勤记录
     * @param list
     * @return
     */
    int modifyAttendanceRecord(@Param("list") List<AttendanceRecordData> list);
}




